package com.robertux.leaderboard.util.gestoresModelos;

import java.util.List;

import javax.persistence.NoResultException;
import javax.persistence.TypedQuery;

import org.apache.log4j.Logger;

import com.robertux.leaderboard.beans.entities.ProyeccionesFarmacia;

public class GestorProyeccionesFarmacias {
	private GestorEntidades<ProyeccionesFarmacia> gestorProyecciones;
	private Logger logger;
	
	public GestorProyeccionesFarmacias() {
		this.gestorProyecciones = new GestorEntidades<ProyeccionesFarmacia>();
		this.logger = Logger.getLogger(this.getClass());
	}
	
	public GestorProyeccionesFarmacias(GestorEntidades<ProyeccionesFarmacia> gestor) {
		this.gestorProyecciones = gestor;
		this.logger = Logger.getLogger(this.getClass());
	}
	
	public List<ProyeccionesFarmacia> getProyecciones() {
		TypedQuery<ProyeccionesFarmacia> qry = this.gestorProyecciones.getEntityManager().createQuery("SELECT proyeccion FROM ProyeccionesFarmacia proyeccion ORDER BY proyeccion.id", ProyeccionesFarmacia.class);
		
		try {
			return qry.getResultList();
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar las proyecciones de farmacias: " + e.getMessage(), e);
			return null;
		}
	}
	
	public List<ProyeccionesFarmacia> getProyecciones(int idSucursal) {
		TypedQuery<ProyeccionesFarmacia> qry = this.gestorProyecciones.getEntityManager().createQuery("SELECT proyeccion FROM ProyeccionesFarmacia proyeccion WHERE proyeccion.farmaciaId = :farmaciaId ORDER BY proyeccion.id", ProyeccionesFarmacia.class);
		qry.setParameter("farmaciaId", idSucursal);
		
		try {
			return qry.getResultList();
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar las proyecciones de farmacias: " + e.getMessage(), e);
			return null;
		}
	}
	
	public ProyeccionesFarmacia getProyeccion(int idSucursal, int anio, int mes) {
		TypedQuery<ProyeccionesFarmacia> qry = this.gestorProyecciones.getEntityManager().createQuery("SELECT proyeccion FROM ProyeccionesFarmacia proyeccion WHERE proyeccion.farmaciaId = :farmaciaId AND FUNC('YEAR', proyeccion.fecha) = :anio AND FUNC('MONTH', proyeccion.fecha) = :mes ORDER BY proyeccion.id", ProyeccionesFarmacia.class);
		qry.setParameter("farmaciaId", idSucursal);
		qry.setParameter("anio", anio);
		qry.setParameter("mes", mes);
		
		try {
			return qry.getSingleResult();
		} catch (NoResultException nrE) {
			return null;
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar la proyección de farmacia: " + e.getMessage(), e);
			return null;
		}
	}
	
	public List<ProyeccionesFarmacia> getProyecciones(int anio, int mes) {
		TypedQuery<ProyeccionesFarmacia> qry = this.gestorProyecciones.getEntityManager().createQuery("SELECT proyeccion FROM ProyeccionesFarmacia proyeccion WHERE FUNC('YEAR', proyeccion.fecha) = :anio AND FUNC('MONTH', proyeccion.fecha) = :mes ORDER BY proyeccion.id", ProyeccionesFarmacia.class);
		qry.setParameter("anio", anio);
		qry.setParameter("mes", mes);
		
		try {
			return qry.getResultList();
		} catch (Exception e) {
			this.logger.error("Error tratando de consultar las proyecciones de farmacias: " + e.getMessage(), e);
			return null;
		}
	}
	
	public ProyeccionesFarmacia getProyeccion(int id) {
		return this.gestorProyecciones.getEntidad("ProyeccionesFarmacia", ProyeccionesFarmacia.class, id);
	}
	
	public boolean agregarProyeccion(ProyeccionesFarmacia proyeccion) {
		try {
			this.gestorProyecciones.persistir(proyeccion);
			return true;
		} catch (Exception e) {
			this.logger.error("Error tratando de persistir la proyección: " + e.getMessage(), e);
			return false;
		}
	}
	
	public boolean actualizarProyeccion(ProyeccionesFarmacia proyeccion) {
		try {
			this.gestorProyecciones.actualizar(proyeccion);
			return true;
		} catch (Exception e) {
			this.logger.error("Error tratando de actualizar la proyección: " + e.getMessage(), e);
			return false;
		}
	}
	
	public boolean delProyeccion(ProyeccionesFarmacia proyeccion) {
		try {
			this.gestorProyecciones.eliminar(proyeccion);
			return true;
		} catch (Exception e) {
			this.logger.error("Error tratando de eliminar la proyecci�n: " + e.getMessage(), e);
			return false;
		}
	}
}
